home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / ugoku / src.lzh / MOVRLF / MRLFPLY.C < prev    next >
Text File  |  1994-09-10  |  15KB  |  686 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11. #include <snd.h>
  12. #include "ugoku.h"
  13. #include "movrlf.h"
  14.  
  15.  
  16. /*    V00ì─É╢    */
  17.  
  18. v00WakuClearPlay( char *name )
  19. {
  20.     int ret ;
  21.     int frame, x, y, wt ;
  22.     int dummy ;
  23.  
  24.     ret = v00_head_read( name, &frame, &x, &y, &wt ) ;
  25.     if( ret == NOERR )
  26.     {
  27.         v_waku_clear( x, y, 2 ) ;        /* ÿgö▓é½ */
  28.         MG_mosDisp( 0 ) ;
  29.         ret = v00_play2( name, 0, 0x7fffffff, &dummy, 0 );
  30.         MG_mosDisp( 1 ) ;
  31.     }
  32.     return ret ;
  33. }
  34.  
  35. /*    MVBì─É╢    */
  36.  
  37. mvbWakuClearPlay( char *name )
  38. {
  39.     int ret ;
  40.     int frame, x, y, wt ;
  41.  
  42.     ret = mvb_head_read( name, &frame, &x, &y, &wt ) ;
  43.     if( ret == NOERR )
  44.     {
  45.         v_waku_clear( x, y, 2 ) ;        /* ÿgö▓é½ */
  46.         MG_mosDisp( 0 ) ;
  47.         ret = mvb_play2( name, 0, 0x7fffffff, 0 );
  48.         MG_mosDisp( 1 ) ;
  49.     }
  50.     return ret ;
  51. }
  52.  
  53.  
  54. /*
  55.     v00 play 2 âtâîü[âÇé╠ôrÆåé⌐éτì─É╢ë┬ö\
  56. */
  57.  
  58. static v00_play2( name, p1, p2, f, w )
  59. char name[] ;
  60. int p1, p2, *f, w ;
  61. {
  62.     FILE *fp, *fps;
  63.     int wait, orgWait, n, point ;
  64.     int v00xd = 128, v00yd = 96;
  65.     int temp, size, sbflg, note;
  66.     char head[256];
  67.     char para[64], names[100];
  68.     char *sbuf, *buf;        /* buffer */
  69.  
  70.     *f = -1 ;
  71.     if( p2 < p1 )p2 = p1 ;
  72.     if( (buf = (char *)TL_malloc( 320*240*2 )) == NULL ){
  73.         return 7;
  74.     }
  75.  
  76.         /* mute */
  77.     int s ;
  78.     SND_get_elevol_mute( &s ) ;
  79.     SND_elevol_mute( s | 0x01 ) ;
  80.  
  81.     sbflg = 0;
  82.     if( file_kakuchousi_set( names, name, ".SND" ) )goto vd02;
  83.     if( ( fps = fopen( names, "rb" ) ) == NULL )goto vd02;
  84.     if( fread( buf, 32, 1, fps ) < 1 )goto vd01;
  85.     size = DWORD( buf+12 ) ;
  86.     point = DWORD( buf+16 ) + p1 * 800 ;
  87.     note = BYTE( buf+28 );
  88.     if( (sbuf = (char *)TL_malloc( size + 32 )) == NULL )goto vd01;
  89.     sbflg = -1;            /* buffer open */
  90.     fseek( fps, 0, SEEK_SET );
  91.  
  92.     if( fread( sbuf, 32, 1, fps ) < 1 )goto vd01;
  93.     if( ( point > 0 ) && ( point <= size ) )
  94.     {
  95.         size = size - point ;
  96.         fseek( fps, point, SEEK_CUR );
  97.         DWORD( sbuf+12 ) = size ;
  98.     }
  99.     if( fread( sbuf + 32, size, 1, fps ) < 1 )goto vd01;
  100.  
  101.     sbflg = 1;            /* pcm play ok */
  102.     SND_pcm_sound_delete( -1 );
  103.     SND_pcm_mode_set( 1 );
  104. vd01:    fclose( fps );
  105.  
  106. vd02:    if( ( fp = fopen( name, "rb" ) ) == NULL )
  107.     {
  108.         if( sbflg )TL_free( sbuf );
  109.         TL_free( buf );
  110.         return 1;
  111.     }
  112.  
  113.     if( fread( head, 256, 1, fp ) < 1 ){    /* âwâbâ_ü[ */
  114.         fclose(fp);
  115.         if( sbflg )TL_free( sbuf );
  116.         TL_free( buf );
  117.         return 1;
  118.     }
  119.     if
  120.     (
  121.         (DWORD( head +  0 ) == 0x30304456)    /* VD00 */
  122.      && (DWORD( head + 12 ) == 0x80008000)    /* dataé╠Äφù▐ö╘ìå */
  123.     )
  124.     {
  125.         v00xd = DWORD( head + 16 );    /* ëí */
  126.         v00yd = DWORD( head + 20 );    /* Åc */
  127.         orgWait = DWORD( head + 24 );    /* âIâèâWâiâïwait */
  128.     }
  129.     else
  130.     {
  131.         v00xd = 128;            /* ëí */
  132.         v00yd = 96;            /* Åc */
  133.         orgWait = 6;            /* Åc */
  134.         fseek( fp, 0, SEEK_SET );
  135.     }
  136.     if( v00xd * v00yd > 320*240 ){    /* ïKèiâIü[âoü[ */
  137.         fclose(fp);
  138.         if( sbflg )TL_free( sbuf );
  139.         TL_free( buf );
  140.         return 58;
  141.     }
  142.  
  143.     wait = orgWait + w ;    /* âEâGâCâgë┴ÄZ */
  144.  
  145.     size = v00xd*v00yd*2;        /* ÉµæùéΦ */
  146.     n = -1 ;
  147.     if( fseek( fp, p1*size, SEEK_CUR ) == 0 )
  148.     {
  149.         n = p1 ;
  150.     }
  151.     else
  152.     {
  153.         fclose(fp);
  154.         if( sbflg )TL_free( sbuf );
  155.         TL_free( buf );
  156.         return 1;
  157.     }
  158.  
  159.     if( sbflg )
  160.     {
  161.         WORD( sbuf+24 ) = WORD( sbuf+24 ) * wait / orgWait;
  162.         DWORD( sbuf+16 ) = 0 ;    /* loop point */
  163.         DWORD( sbuf+20 ) = 0 ;    /* loop length */
  164.     }
  165.  
  166.     EGB_writePage(guiEgbPtr,0);
  167.     EGB_displayStart(guiEgbPtr,1,0,0);
  168.     EGB_displayStart(guiEgbPtr,2,2,2);
  169.     EGB_displayStart(guiEgbPtr,3,v00xd,v00yd);
  170.     EGB_displayStart(guiEgbPtr,0,(320-v00xd)/2,(240-v00yd)/2);
  171.     EGB_displayPage(guiEgbPtr,1,3);
  172.  
  173.     DWORD(para+0) = (int)buf;
  174.     WORD(para+4) = 0x14;
  175.     WORD(para+6) = 0;
  176.     WORD(para+8) = 0;
  177.     WORD(para+10) = 0 + v00xd - 1;
  178.     WORD(para+12) = 0 + v00yd - 1;
  179.  
  180.     temp = 1 ;
  181.     SND_fm_timer_b_set( 0, 0 ) ;
  182.     VSYNC_init();
  183.     if( n >= 0 )
  184.     {
  185.       for( n=p1 ; n<=p2 ; n++ )
  186.       {
  187.         int ret ;
  188.  
  189.         if( VSYNC_counter < (wait << 1) ) /* é⌐é╚éΦè░æσ */
  190.         {
  191.             if( fread( buf, size, 1, fp ) < 1 )break ;
  192.             while( VSYNC_counter < wait );
  193.             VSYNC_counter -= wait ;
  194.             EGB_putBlock( guiEgbPtr, 0, para );
  195.  
  196.             ret = play_check() ;
  197.             if( ret )
  198.             {
  199.                 if( ret == 1 ){            /* êΩÄ₧ÆΓÄ~é╠îπì─èJé╖éΘ */
  200.                     VSYNC_counter = 0;
  201.                 }
  202.                 if( ret == -1 ){        /* ÅIù╣ */
  203.                     break ;
  204.                 }
  205.             }
  206.  
  207.         }
  208.         else
  209.         {
  210.             if( fseek( fp, size, SEEK_CUR ) )break;
  211.             VSYNC_counter -= wait ;
  212.         }
  213.  
  214.         if( temp )
  215.         {
  216.             if( sbflg ){
  217.                 SND_pcm_play( 71, note, 127, sbuf );
  218.             }
  219.             temp = 0;
  220.         }
  221.       }
  222.     }
  223.     VSYNC_end();
  224.     SND_pcm_sound_delete( -1 );
  225.     SND_fm_timer_b_start() ;
  226.  
  227.     *f = n ;    /* ì─É╢âtâîü[âÇÉöé≡âoâbâN */
  228.  
  229.     fclose(fp);
  230.     if( sbflg )TL_free( sbuf );
  231.     TL_free( buf );
  232.  
  233.     EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  234.     EGB_paintMode(guiEgbPtr,0x22);
  235.     EGB_writeMode(guiEgbPtr,0);
  236.     EGB_displayPage(guiEgbPtr,1,3);        /* mode3é¬æOæñ */
  237.  
  238.     return 0;
  239. }
  240.  
  241. v00_head_read( char *name, int *frame, int *v00xd, int *v00yd, int *wait )
  242. {
  243.     FILE *fp;
  244.  
  245.     char head[256] ;
  246.  
  247.         /* âfü[â^â`âFâbâN */
  248.     *frame = -1 ;
  249.     if( ( fp = fopen( name, "rb" ) ) == NULL )
  250.     {
  251.  
  252.         EGB_displayPage(guiEgbPtr,1,3);
  253.         EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  254.  
  255.         return 1;
  256.     }
  257.     if( fread( head, 256, 1, fp ) < 1 ){    /* âwâbâ_ü[ */
  258.         fclose(fp);
  259.  
  260.         EGB_displayPage(guiEgbPtr,1,3);
  261.         EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  262.  
  263.         return 1;
  264.     }
  265.     if
  266.     (
  267.         (DWORD( head +  0 ) == 0x30304456)    /* VD00 */
  268.      && (DWORD( head + 12 ) == 0x80008000)    /* dataé╠Äφù▐ö╘ìå */
  269.     )
  270.     {
  271.         *frame = DWORD( head + 8 );    /* frame */
  272.         *v00xd = DWORD( head + 16 );    /* ëí */
  273.         *v00yd = DWORD( head + 20 );    /* Åc */
  274.         *wait = DWORD( head + 24 );    /* wait */
  275.     }
  276.     else
  277.     {
  278.         *v00xd = 128;            /* ëí */
  279.         *v00yd = 96;            /* Åc */
  280.         *wait = 6;            /* Åc */
  281.         fseek( fp, 0, SEEK_SET );
  282.     }
  283.  
  284.         /* ì┼Åëé╠âtâîü[âÇé≡ò\Ī */
  285.  
  286.     int size ;
  287.     char *buf, para[64] ;
  288.  
  289.     if( (buf = (char *)TL_malloc( 320*240*2 )) == NULL )
  290.     {
  291.         fclose(fp);
  292.  
  293.         EGB_displayPage(guiEgbPtr,1,3);
  294.         EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  295.  
  296.         return 7;
  297.     }
  298.     if( (*v00xd) * (*v00yd) > 320*240 ){    /* ïKèiâIü[âoü[ */
  299.         fclose(fp);
  300.         TL_free( buf );
  301.  
  302.         EGB_displayPage(guiEgbPtr,1,3);
  303.         EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  304.  
  305.         return 58;
  306.     }
  307.  
  308.     EGB_writePage(guiEgbPtr,0);
  309.     EGB_displayStart(guiEgbPtr,1,0,0);
  310.     EGB_displayStart(guiEgbPtr,2,2,2);
  311.     EGB_displayStart(guiEgbPtr,3,0,0);
  312.     EGB_displayStart(guiEgbPtr,0,(320 - (*v00xd))/2,(240 - (*v00yd))/2);
  313.     EGB_displayStart(guiEgbPtr,3,*v00xd,*v00yd);
  314.  
  315.     DWORD(para+0) = (int)buf;
  316.     WORD(para+4) = 0x14;
  317.     WORD(para+6) = 0;
  318.     WORD(para+8) = 0;
  319.     WORD(para+10) = 0 + (*v00xd) - 1;
  320.     WORD(para+12) = 0 + (*v00yd) - 1;
  321.     size = (*v00xd) * (*v00yd) * 2;
  322.  
  323.     if( fread( buf, size, 1, fp ) < 1 )
  324.     {
  325.         fclose(fp);
  326.         TL_free( buf );
  327.  
  328.         EGB_displayPage(guiEgbPtr,1,3);
  329.         EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  330.  
  331.         return 0;        /* frame 0ûçé╞éóéñé▒é╞éαéáéΦô╛éΘ */
  332.     }
  333.     EGB_putBlock( guiEgbPtr, 0, para );
  334.  
  335.     EGB_displayPage(guiEgbPtr,1,3);
  336.     EGB_writePage(guiEgbPtr,1);            /* mode3é╔Åæé½ì₧é▌ */
  337.  
  338.     fclose(fp);
  339.     TL_free( buf );
  340.     return 0 ;
  341. }
  342.  
  343.  
  344. /*
  345.     mvb play 2 âtâîü[âÇé╠ôrÆåé⌐éτì─É╢ë┬ö\
  346. */
  347.  
  348. static mvb_play2( name, p1, p2, w )
  349. char name[] ;
  350. int p1, p2, w ;
  351. {
  352.     FILE *fp, *fps;
  353.     int wait0, wait, n, point, freq, frame ;
  354.     int v00xd = 128, v00yd = 96;
  355.     int temp, size, sbflg, note;
  356.     char head[256];
  357.     char para[64], names[100];
  358.     char *sbuf, *buf;        /* buffer */
  359.  
  360.     temp = mvb_head_read_only( name, &frame, &v00xd, &v00yd, &wait0 ) ;
  361.     if( temp )
  362.         return temp ;
  363.  
  364.     if( p2 < p1 )p2 = p1 ;
  365.     if( (buf = (char *)TL_malloc( 320*240*2 )) == NULL ){
  366.         return 7;
  367.     }
  368.  
  369.         /* mute */
  370.     int s ;                    /* é▒éñé╖éΘé╞pcmé╛é»é≡oné╔é┼é½éΘ */
  371.     SND_get_elevol_mute( &s ) ;
  372.     SND_elevol_mute( s | 0x01 ) ;
  373.  
  374.     sbflg = 0;
  375.     if( file_kakuchousi_set( names, name, ".SND" ) )goto vd02;
  376.     if( ( fps = fopen( names, "rb" ) ) == NULL )goto vd02;
  377.     if( fread( buf, 32, 1, fps ) < 1 )goto vd01;
  378.  
  379.     freq = ( ( WORD( buf+24 )*10 + 0x31 ) / 0x62 ) * 100 ;    /* freq */
  380.     size = DWORD( buf+12 ) ;
  381.     point = DWORD( buf+16 ) + p1 * freq * wait0 / 60 ;
  382.     note = BYTE( buf+28 );
  383.  
  384.